package cn.kgc.spring.jdbc.service;

import cn.kgc.spring.jdbc.mapper.AccountMapper;
import cn.kgc.spring.jdbc.mapper.StudentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author: mosin
 * @version: v1.0  2022/4/26
 *
 * 转账  事务   ->组成事务的所有sql语句 要么全部执行成功  要么全部失败
 *  事务特性：
 *      1.原子性
 *      2.一致性
 *      3.隔离性
 *          隔离级别：
 *              1.读未提交    脏读
 *              2.读已提交    不可重复度
 *              3.可重复读    mysql       在同一个事务下 相同的查询结果都是一致的      幻读
 *              4.串行化     事务之间操作数据库需要有序执行  效率低   insert   -> commit  -> select
 *      4.持久性
 *
 * 事务处理的方式：
 *  1.编程式事务处理   try  catch    commit  rollback
 *  2.声明式事务处理   spring
 *      1.注解
 *          步骤：
 *              1.导包  spring-tx
 *              2.配置事务管理器 DataSourceTransactionManager
 *              3. 配置注解驱动   tx:annotation-driven
 *              4. 在需要事务控制的类上添加    Transactional注解
 *                   Transactional注解属性:
 *                           1.propagation 事务的传播行为   事务方法  DML
 *                           2.isolation     事务隔离级别
 *                           3.rollbackFor  指定何种异常进行回滚
 *                           4.noRollbackFor  指定不回滚的异常
 *                           5.timeout        事务提交的失效时间   秒
 *      2.xml配置文件
 */
/*
    使用注解完成事务配置
    2.在需要事务控制的业务类上添加Transactional注解  类中的方法全部添加了事务控制
    3.Transactional注解添加在方法上 只为当前方法添加事务控制
*/
@Service
@Transactional
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountMapper accountMapper;
    @Override
    public void transfer() { // 转账业务

        //转出
        int line1= accountMapper.subMoney(1, 100);
        System.out.println("line1 = " + line1);
        int i = 1/0;
        //转入
        int line2 = accountMapper.addMoney(2, 100);
        System.out.println("line2 = " + line2);

    }
}
